/**
 * 高德地图定位工具（React Native版本）
 * 国内环境优化：使用高德定位替代GPS
 */

import { AMAP_WEB_KEY } from '@env';

export const AMAP_KEY = AMAP_WEB_KEY || '3662eb89e8bcc16dfe4f598f90856330';

/**
 * 使用高德IP定位（最快，1秒内，误差1-5公里）
 * 适用于React Native环境
 * @returns {Promise<{longitude: number, latitude: number, city: string, adcode: string}>}
 */
export async function getAmapIPLocation() {
  try {
    const response = await fetch(
      `https://restapi.amap.com/v3/ip?key=${AMAP_KEY}&output=json`,
      {
        method: 'GET',
        headers: {
          'Content-Type': 'application/json',
        },
      },
    );

    const data = await response.json();

    if (data.status === '1') {
      // 如果有rectangle（矩形范围），取中心点
      let longitude, latitude;

      if (data.rectangle) {
        // rectangle格式: "lng1,lat1;lng2,lat2"（高德API返回的是经度在前，纬度在后）
        const [point1, point2] = data.rectangle.split(';');
        const [lng1, lat1] = point1.split(',').map(Number);
        const [lng2, lat2] = point2.split(',').map(Number);
        longitude = (lng1 + lng2) / 2;
        latitude = (lat1 + lat2) / 2;
      } else {
        // 使用城市中心点作为默认值
        const cityCenter = getCityCenterCoords(data.city);
        longitude = cityCenter.longitude;
        latitude = cityCenter.latitude;
      }

      return {
        longitude,
        latitude,
        city: data.city || data.province,
        adcode: data.adcode,
        province: data.province,
        accuracy: 'low', // IP定位精度低
        source: 'amap_ip',
        coordinateSystem: 'GCJ-02', // 高德API返回的是GCJ-02坐标系，不需要转换
      };
    } else {
      throw new Error(`高德IP定位失败: ${data.info || '未知错误'}`);
    }
  } catch (error) {
    throw error;
  }
}

/**
 * 根据城市名称获取中心坐标（备用）
 */
function getCityCenterCoords(cityName) {
  const cityCoords = {
    北京市: { longitude: 116.407526, latitude: 39.90403 },
    上海市: { longitude: 121.473701, latitude: 31.230416 },
    广州市: { longitude: 113.264385, latitude: 23.129112 },
    深圳市: { longitude: 114.057868, latitude: 22.543099 },
    杭州市: { longitude: 120.209947, latitude: 30.245853 },
    成都市: { longitude: 104.066541, latitude: 30.572269 },
    重庆市: { longitude: 106.551557, latitude: 29.56301 },
    武汉市: { longitude: 114.305539, latitude: 30.593102 },
    西安市: { longitude: 108.940174, latitude: 34.341568 },
    乌鲁木齐市: { longitude: 87.617733, latitude: 43.792818 },
  };

  return cityCoords[cityName] || { longitude: 116.407526, latitude: 39.90403 }; // 默认北京
}

/**
 * 智能定位策略：优先使用高德IP定位（快速），失败则降级到GPS
 * @param {Function} fallbackGPSLocation - GPS定位备用函数
 * @returns {Promise<{longitude: number, latitude: number, city: string, adcode: string}>}
 */
export async function getAmapSmartLocation(fallbackGPSLocation) {
  // 策略1: 优先使用高德IP定位
  try {
    const ipLocation = await getAmapIPLocation();
    return {
      ...ipLocation,
      message: 'IP定位成功（误差1-5公里）',
    };
  } catch (error) {}

  // 策略2: 如果高德IP定位失败，使用GPS定位作为备用
  if (fallbackGPSLocation) {
    try {
      const gpsLocation = await fallbackGPSLocation();
      return {
        ...gpsLocation,
        source: 'gps',
        message: 'GPS定位成功',
      };
    } catch (gpsError) {}
  }

  // 所有定位都失败
  throw new Error('所有定位方式均失败');
}
